GitHub Actions を利用して AWS SAM のデプロイ環境をセットアップしてみた
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
最近、 AWS SAM を複数人開発で利用するケースに遭遇し、将来的に CI/CD が必要になりそうな予感がしています。
そこで今回は以下の構成のように、 GitHub Actions を利用して AWS へのデプロイ環境を構築してみたいと思います。
GitHub と AWS 間の認証認可
GitHub と AWS の間の認証認可を設定します。以下を実施します。
ID プロバイダの作成
GitHub との連携用に OpenID Connect を利用した IAM ロールの作成を行います。
IAM コンソールから ID プロバイダをクリックします。
ID プロバイダの作成をクリックし、プロバイダの URL と対象者を入力します。
- プロバイダの URL:
https://token.actions.githubusercontent.com
- 対象者:
sts.amazonaws.com
作成されたら ID プロバイダの ARN をメモしておきます。
IAM ロールの作成
続いて IAM ロールを作成してきます。
信頼ポリシーはカスタムを選択し、プロバイダの ARN は先ほどメモしておいた ARN、 "token.actions.githubusercontent.com:sub"
は紐付けしたいリポジトリを指定します。
(私の場合だと hogehoge-org の hogehoge-repo の任意のブランチからデプロイできるようにしています。)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:hogehoge-org/hogehoge-repo:*"
},
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
}
}
}
]
}
権限に関しては現時点では絞れなさそうなので AdministratorAccess 権限としました。
ワークフローの作成
GitHub 側のワークフローに移ります。今回は次のファイルを作成しました。
name: Deploy-AWS-SAM-Application
on:
push:
branches:
- 'develop'
env:
TEMPLATE_FILE: template.yaml
SAM_CLI_TELEMETRY: 0
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
with:
use-installer: true
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
aws-region: ap-northeast-1
role-session-name: SamDeploy
- run: sam build
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
起点ブランチ
develop ブランチを起点に、ワークフローが動く仕組みになっています。
必要に応じて適宜、ブランチ別で環境を用意しても良いかもですね。
ひとまずテスト段階。最終的にはエイリアスを利用して環境まとめたいので develop ブランチのみでスタートしてみました。
name: Deploy-AWS-SAM-Application
+ on:
+ push:
+ branches:
+ - 'develop'
env:
TEMPLATE_FILE: template.yaml
SAM_CLI_TELEMETRY: 0
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
with:
use-installer: true
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
aws-region: ap-northeast-1
role-session-name: SamDeploy
- run: sam build
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
permissions
permissions は以下の通り、 id-token: write
と contents: read
を付与しました。
ジョブまたはワークフローの実行には、GitHub の OIDC プロバイダーが実行ごとに JSON Web Token を作成できるようにするために、id-token: write を含む permissions 設定が必要です。 id-token の permissions が write に設定されていない場合、OIDC JWT ID トークンを要求することはできません。ただし、この値はリソースへの書き込みアクセスを許可することを意味せず、アクションまたはステップの OIDC トークンをフェッチして設定し、有効期間の短いアクセス トークンを使用して認証を有効にできるだけです。 実際の信頼の設定は OIDC 要求を使用して定義されます。詳細については、「OpenID Connect を使ったセキュリティ強化について」を参照してください。
name: Deploy-AWS-SAM-Application
on:
push:
branches:
- 'develop'
env:
TEMPLATE_FILE: template.yaml
SAM_CLI_TELEMETRY: 0
permissions:
+ id-token: write
+ contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
with:
use-installer: true
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
aws-region: ap-northeast-1
role-session-name: SamDeploy
- run: sam build
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
Assume 先の権限
以下のドキュメントだと、aws-actions/configure-aws-credentials
が古いものとなっており、アクセスキーを利用するパターンとなっていました。
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
- uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-2
- run: sam build --use-container
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
aws-actions/configure-aws-credentials@v4
の場合、先ほど作成した IAM ロールを利用できるためこちらのバージョンアップを行いました。
name: Deploy-AWS-SAM-Application
on:
push:
branches:
- 'develop'
env:
TEMPLATE_FILE: template.yaml
SAM_CLI_TELEMETRY: 0
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
with:
use-installer: true
- - uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- aws-region: us-east-2
+ - uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
+ aws-region: ap-northeast-1
+ role-session-name: SamDeploy
- run: sam build
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
SAM Setup
以下のブログのように素の aws-actions/setup-sam
を利用するとビルドに時間がかかるため、 use-installer: true
を利用して短縮を行いました。(ありがたいですね)
actions/setup-python@v3
は Python ランタイムの Lambda を利用するため継続利用しました。
name: Deploy-AWS-SAM-Application
on:
push:
branches:
- 'develop'
env:
TEMPLATE_FILE: template.yaml
SAM_CLI_TELEMETRY: 0
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-22.04
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: aws-actions/setup-sam@v2
+ with:
+ use-installer: true
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::194722430871:role/github-actions-role
aws-region: ap-northeast-1
role-session-name: SamDeploy
- run: sam build
- run: sam deploy --no-confirm-changeset --no-fail-on-empty-changeset
ビルド/デプロイの時間は、使っているリソースによって左右するため、今回は触れませんが、ビルド/デプロイまでの初期セットアップは非常に高速に準備できていますね。
まとめ
以上、「GitHub Actions を利用して AWS SAM のデプロイ環境をセットアップしてみた」でした。
aws-actions
がかなり充実しており、コード量が非常に少なく便利ですね。
おもしろい aws-actions がないか調べてみたくなりました。このブログが参考になれば幸いです。
クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!